﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Data;
using System.Transactions;
using System.Text;
using DAL;
using System.Web;
using System.Web.UI;
using System.IO;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data.OleDb;

namespace BOL
{
    [Serializable]
    public  class TaskProcesoBL
    {

        private  void importExcel(dbGestionDataContext _db,Presupuesto dbpres)
        {

             Microsoft.Office.Interop.Excel.Application xlsApp =new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook wbPresupuesto;
            Microsoft.Office.Interop.Excel.Worksheet wsPresupuesto;



            //string local = Parametros.ubicacionServerLocal;
            //string directorioArchivo = local + String.Format("\\{0}\\{1}", dbpres.idObra, dbpres.archivo);

            //// ingreso depuracion
            string ruta = String.Format(@"C:\Desarrollo Web\EOMGestionUlt\UILGestion\App_Data\Presupuesto\{0}\{1}",dbpres.idObra, dbpres.archivo);
               string directorioArchivo = ruta ;
                
                string archivo = dbpres.archivo;


            SubPresupuesto subPresupuesto = new SubPresupuesto();
           
            Rendimiento rendimiento = new Rendimiento();
            Partida partida = new Partida();


            string codigo=string.Empty;
            string descripcion = string.Empty;
            DateTime fecha = DateTime.Now;


            bool FinArchivo = false;
            int numeroCelda = 1;
            int condadorVacio = 1;
            int cursor = 0;
            string celdaValor = "";
            try
            {

                wbPresupuesto = xlsApp.Workbooks.Open(directorioArchivo);


                wsPresupuesto =
                    (Microsoft.Office.Interop.Excel.Worksheet)wbPresupuesto.ActiveSheet;

              // los enumerodos de  grupodatos;

                List<GrupoDatoitem> enumGrupo = (from a in _db.GrupoDatoitems
                                                where a.idGrupo == 2
                                                 select a).ToList <GrupoDatoitem>();
                
                int intgrupo = 0;
               
                while (!FinArchivo)
                {


                    cursor++;
                    celdaValor =
                        this.ReadCelda(ref wsPresupuesto, "A" + cursor);
                    numeroCelda++;
                    

                    if (celdaValor == "Presupuesto")
                    {

                        codigo =
                        this.ReadCelda(ref wsPresupuesto, "C" + cursor);
                        descripcion =
                        this.ReadCelda(ref wsPresupuesto, "D" + cursor);
  

                    }
                    if (celdaValor == "Subpresupuesto")
                    {
                        subPresupuesto =
                                  new SubPresupuesto();
                        subPresupuesto.codigo =this.ReadCelda(ref wsPresupuesto, "C" + cursor);
                        subPresupuesto.Descripcion =this.ReadCelda(ref wsPresupuesto, "D" + cursor);
                        

                        string fechastr =this.ReadCelda(ref wsPresupuesto, "K" + (cursor));
                        
                         //fecha =new DateTime(
                         //      Convert.ToInt32(fechastr.Substring(6, 4)),
                         //      Convert.ToInt32(fechastr.Substring(3, 2)),
                         //      Convert.ToInt32(fechastr.Substring(0, 2)));
                         fecha = new DateTime();
                         fecha = DateTime.Now;

                        
                        subPresupuesto.idPresupuesto = dbpres.idInternal;
                        
                    }
                    if (celdaValor == "Partida")
                    {
                        partida =new Partida();
                        partida.codigo =this.ReadCelda(ref wsPresupuesto, "C" + cursor);
                        partida.descripcion =this.ReadCelda(ref wsPresupuesto, "E" + cursor);
                        partida.idPresupuesto=dbpres.idInternal;
                        partida.fechaCre = DateTime.Now;
                        subPresupuesto.Partidas.Add(partida);
                       
                    }
                    if (celdaValor == "Rendimiento")
                    {
                        rendimiento =new Rendimiento();
                        condadorVacio = 0;
                        rendimiento.descripcion =this.ReadCelda(ref wsPresupuesto, "C" + cursor);

                        //caso de nulos en excel
                        decimal valor = 0;
                        decimal.TryParse(this.ReadCelda(ref wsPresupuesto, "F" + cursor), out valor);
                                    if (valor != 0)
                                        rendimiento.valor = valor;

                        rendimiento.EQ =this.ReadCelda(ref wsPresupuesto, "E" + cursor);
                        //caso de nulos en excel
                        decimal eqvalor = 0;
                        decimal.TryParse(this.ReadCelda(ref wsPresupuesto, "F" + cursor), out eqvalor);
                                    if (eqvalor != 0)
                                        rendimiento.eqValor = eqvalor;

                        string costo =this.ReadCelda(ref wsPresupuesto, "I" + cursor);
                        rendimiento.costoAfecMetrado = clearDecimal(costo);

                        rendimiento.monto = Convert.ToDecimal(this.ReadCelda(ref wsPresupuesto, "J" + cursor));

                        partida.Rendimientos.Add(rendimiento);
                        intgrupo = 0;
                        
                    }
                    //Grupo
                    if (celdaValor == "" & (this.ReadCelda(ref wsPresupuesto, "D" + cursor) != "") )
                    {
                        string grupo = "";
                        intgrupo = 0;
                        grupo=this.ReadCelda(ref wsPresupuesto, "D" + cursor);

                        foreach (var item in enumGrupo)
                        {
                          if (grupo.ToUpper().Trim() == item.descripcion.ToUpper().Trim())
                          {
                            intgrupo = item.idInternal;
                          }
                        }
                      
                        if (intgrupo == 0)
                        {
                          //registramos el grupo y asignamos el nuevo valor
                          GrupoDatoitem grupoItem= new GrupoDatoitem();
                          intgrupo=grupoItem.addGrupoRecurso(_db,grupo.Trim());
                          //si  aparace otro campo
                          enumGrupo.Add(grupoItem);
                         // throw new Exception("No existe  registro del grupo :" + grupo+".Antes de importar debe crear el grupo");

                        }
                     
                    }
                    
                    if (celdaValor.Length >= 8)
                    {
                        if (celdaValor == "0243010003")
                        {
                            string a = "s";
                        }
                        


                        Int64 val = 0;
                        Int64.TryParse(celdaValor, out  val);
                        if (val != 0)
                        {
                            
                            

                            string reccodigo =this.ReadCelda(ref wsPresupuesto, "A" + cursor);
                           

                            string recdescripcion =this.ReadCelda(ref wsPresupuesto, "C" + cursor);
                            string recunidad =this.ReadCelda(ref wsPresupuesto, "F" + cursor);
                            decimal cuadrilla = 0;
                            decimal? reccuadrilla=null;
                            decimal.TryParse(this.ReadCelda(ref wsPresupuesto, "H" + cursor),out cuadrilla);
                                if (cuadrilla != 0) {
                                    reccuadrilla = cuadrilla;
                                }

                            decimal reccantidad = Convert.ToDecimal(this.ReadCelda(ref wsPresupuesto, "I" + cursor));
                            decimal recprecio = Convert.ToDecimal(this.ReadCelda(ref wsPresupuesto, "J" + cursor));
                            decimal recparcial = Convert.ToDecimal(this.ReadCelda(ref wsPresupuesto, "K" + cursor));
                            //decimal recparcialMonBase = recurso.parcial.Value * dbpres.tipoCambio.Value;
                                //verificamos para  Label coleccion decimal insumos;
                                // buscamos el id del insumo
                                InsumoBL bl = new InsumoBL();
                                Insumo insumo = bl.getInsumoFromCodigoS10(recdescripcion.Trim(), reccodigo.Trim());
                                if (recunidad.Trim() == "lt") { recunidad = "l"; }
                                InsumoUnidad insumoUnidad = bl.getInsumoUnidadFromAbrev(recunidad.Trim());

                            if (insumo==null)
                            {
                                //buscamos el valor de idunidad
                                  
                                    if (insumoUnidad==null)
                                        {
                                    // registramos el valor de 
                                            insumoUnidad = new InsumoUnidad();
                                             insumoUnidad.add(_db, 
                                                        recunidad.ToUpper(), 
                                                        recunidad.ToUpper());
                                    
                                         }
                                insumo = new Insumo();
                                

                                insumo.Add(_db,
                                    insumo.getCorrelativo(_db,"999999",3),
                                    recdescripcion,
                                    insumoUnidad.idInternal,
                                    3,
                                    5571,
                                    false,
                                    1,
                                    reccodigo,
                                    "",
                                    false
                                    );
                                // creamos la tarea  para el empleado

                                TaskEmpleado emplo = new TaskEmpleado();
                                String nota=string.Format("Verificar Insumos nuevos registrados del presupuesto:{0}",insumo.codigo);
                                emplo.Add(_db,
                                    1,
                                    nota,
                                    nota,
                                    31,
                                    1);
                            }

                            int? grupo = null;
                            if (intgrupo != 0) { grupo = intgrupo; }

                                //recurso.setOnInsert(id
                            Recurso recurso = new Recurso();
                           
                            recurso.idPartida = partida.idInternal;
                            recurso.setOnInsert(insumo.idInternal,
                                reccodigo,
                                recdescripcion,
                                insumoUnidad.abreviacion,
                                reccuadrilla,
                                reccantidad,
                                recprecio,
                                recparcial,
                                recurso.idInternal,
                                grupo,
                                0,
                                null);
                            
                            partida.Recursos.Add(recurso);
                            condadorVacio = 0;
                        }
                    }
                    //para terminar con el recorrido
                    if (celdaValor == "")
                    {
                        condadorVacio++;
                    }
                    if (condadorVacio == 15)
                        break;
                }
                
                using(TransactionScope ts = new TransactionScope())
                {
                    
                        _db.SubPresupuesto.InsertOnSubmit(subPresupuesto);
                        _db.SubmitChanges();

                        dbpres.codigo = codigo;
                        dbpres.descripcion = descripcion;
                        dbpres.monto = dbpres.GetMontoTotal(_db);
                        _db.SubmitChanges();
                        ts.Complete();
            
                }
            }


            catch (Exception ex)
            {
                //errores de carga
                dbpres.codigo = "ERROR ARC";
                _db.SubmitChanges();


                xlsApp.ActiveWorkbook.Close(true,directorioArchivo,  Type.Missing);
                throw new Exception(ex.Message +"Ruta:" + directorioArchivo + "celda:" + celdaValor+"CURSOR:"+cursor);
            }
            finally
            {
                xlsApp.ActiveWorkbook.Close(true, directorioArchivo, Type.Missing);
                xlsApp.Quit();
                xlsApp = null;
            }
        }



        public  bool  loadPresupuestoExcel(int idTareaProceso)
        {

            try 
	        {	 
                using (dbGestionDataContext _db =new dbGestionDataContext(Parametros.strConnString))
                {
                    TaskProceso dbtp = _db.TaskProceso.Single(p => p.idinternal == idTareaProceso);
                    
                   
                        //verificamos que existe el  presupuesto
                        var q = _db.Presupuesto.Where(p => p.idInternal == dbtp.idPresupuesto);
                        if (q.Count() > 0)
                        { 
                            //primero  para  no dejar que otro proceso utilice este  hilo broqueamos
                                dbtp.inicioProceso(_db);
                            Presupuesto presupuesto=q.First();
                            importExcel(_db,presupuesto);
                            //actualizamos el presupuesto
                                dbtp.terminarProceso(_db);

                        }
                        else
                        {
                            //eliminamos el registro 
                            _db.TaskProceso.DeleteOnSubmit(dbtp);
                        }
                }
                return true;
		    }
	    catch (Exception ex)
	    {
            //archivo con errores
               
		        throw ex;
	    }
        }
           


     
        private string ReadCelda(ref Microsoft.Office.Interop.Excel.Worksheet sheet, string cell)
        {
            Microsoft.Office.Interop.Excel.Range range = sheet.get_Range(cell, cell);
            if (range.Value2 != null)
                return range.Value2.ToString();
            else
                return "";
        }


        private decimal clearDecimal(string costo)
        {
            decimal num = 0;

            char[] delimiterChars = { '(', ')' };

            string[] Cantidad =
              costo.Split(delimiterChars);
            for (int i = 0; i < Cantidad.Count(); i++)
            {
                if (!(Cantidad[i].Equals("")))
                    decimal.TryParse(Cantidad[i].ToString(), out num);

            }
            return num;
        }


    }
}
